package br.com.caim.email.receb.impl;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Properties;

import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Store;

import br.com.caim.bo.entidade.Provedor;
import br.com.caim.email.excecoes.sistema.ContaEmailIndisponivelException;
import br.com.caim.email.receb.IRecebimentoEmail;

public class RecebimentoEmail implements IRecebimentoEmail {

	public Message[] receberMensagens(String enderecoEmail, String senha, Provedor provedor) throws ContaEmailIndisponivelException {
		Properties props = new Properties();
		Message msgs[] = null;
		Collection listaMensagens = new ArrayList();
		props.put("mail.store.protocol", "pop3");
		
		// TODO adicionar Authenticator a instancia de session
		Session session = Session.getInstance(props);
		
		try {
			Store store = session.getStore("pop3s");
			
			System.out.println("\n\n=================== DADOS =====================");
			System.out.println(provedor.getHostImap());
			System.out.println("USER: " + enderecoEmail);
			System.out.println("SENHA: " + senha);
			System.out.println("===================================================");
			
			// TODO autenticar pelo Authenticator do session
			store.connect(provedor.getHostImap(), enderecoEmail, senha);
			
			// TODO verificar se existem outras pastas
			Folder folder = store.getFolder("INBOX");
			
			// TODO verificar utilizacao de Folder somente leitura ou com escrita tambem
			folder.open(Folder.READ_ONLY);
			
			msgs = folder.getMessages();
			
			// Recupera as mensagens que nao estao marcadas como exlcuidas do servidor
			for(int i = 0; i < msgs.length; i++) {
				if(!msgs[i].isExpunged()) {
					listaMensagens.add(msgs[i]);
				}
			}
		} catch (NoSuchProviderException e) {
			// TODO tratamento de excecao adequado
			e.printStackTrace();
		} catch (MessagingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
	        throw new ContaEmailIndisponivelException("Não foi possível se conectar à seguinte Conta de Email: " + enderecoEmail);
		}
		
		// Parser do ArrayList para um array
		Message total[] = new Message[listaMensagens.size()];
		int i = 0;
		for(Iterator iterator = listaMensagens.iterator(); iterator.hasNext(); i++) {
			Message message = (Message) iterator.next();
			total[i] = message;
			
		}
		
		return total;
	}
	
//	public Message[] receberMensagens(String enderecoEmail, String senha, Provedor provedor) throws ContaEmailIndisponivelException {
//		Properties props = new Properties();
//		Message msgs[] = null;
//		
//		// TODO adicionar Authenticator a instancia de session
//		Session session = Session.getInstance(props, null);
//		
//		try {
//			Store store = session.getStore("pop3");
//			
//			// TODO autenticar pelo Authenticator do session
//			store.connect(provedor.getHostImap(), getNomeContaPeloEmail(enderecoEmail), senha);
//			
//			// TODO verificar se existem outras pastas
//			Folder folder = store.getFolder("INBOX");
//			
//			// TODO verificar utilizacao de Folder somente leitura ou com escrita tambem
//			folder.open(Folder.READ_ONLY);
//			
//			msgs = folder.getMessages();
//		} catch (NoSuchProviderException e) {
//			// TODO tratamento de excecao adequado
//			e.printStackTrace();
//		} catch (MessagingException e) {
//			e.printStackTrace();
//			throw new ContaEmailIndisponivelException("Não foi possível se conectar à seguinte Conta de Email: " + enderecoEmail);
//		}
//		
//		return msgs;
//	}
//	
//	// Recupera o nome da conta a partir do endereco do email
//	private String getNomeContaPeloEmail(String email) {
//		int index = email.indexOf("@");
//		
//		return email.substring(0, index);
//	}
	
}
